package leetcode_数组.统计数组中的元素;

import java.util.HashMap;
import java.util.Map;

// 数组的度
/*x 改变的条件
1、当前数字的个数是最大的，x 直接改变
2、当前数字的个数和最大的是一样的，看谁的长度最小
 */
public class _697 {
    public static void main(String[] args) {
        int[] x = new int[]{2,1,1,2,1,3,3,3,1,3,1,3,2};
        System.out.println(findShortestSubArray(x));
    }

    public static int findShortestSubArray(int[] nums) {
        // map 存放每个数字出现的字数
        Map<Integer, Integer> map = new HashMap<>(), left = new HashMap<>(), right = new HashMap<>();
        int count = 0, x = 0;
        for (int i = 0; i < nums.length; i++) {
            // 计算数字第一次出现的位置和最后一个出现的位置
            if (!left.containsKey(nums[i])) { // 如果 left 中没有，即还没出现过
                left.put(nums[i], i);
            }
            right.put(nums[i], i); // 不管怎样都存进去
            map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
            if (map.get(nums[i]) == count && left.get(x) != null && right.get(x) != null) { // 当前数字的个数和最大值相等，要挑选最短的
                int t1 = right.get(x) - left.get(x) + 1, t2 = right.get(nums[i]) - left.get(nums[i]) + 1;
                if (t2 < t1) {
                    x = nums[i];
                }
            } else if (map.get(nums[i]) > count) {
                count = map.get(nums[i]);
                x = nums[i];
            }
        }
        return left.get(x) != null && right.get(x) != null ? right.get(x) - left.get(x) + 1 : 0;
    }

}
